package com.wangyu.talents.common.utils;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 *
 * @author zhangQ
 * @create date: 2014-12-2
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

  private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
      "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm"};

  /**
   * 得到当前日期字符串 格式（yyyy-MM-dd）
   */
  public static String getDate() {
    return getDate("yyyy-MM-dd");
  }

  /**
   * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
   */
  public static String getDate(String pattern) {
    return DateFormatUtils.format(new Date(), pattern);
  }

  /**
   * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
   */
  public static String formatDate(Date date, String pattern) {
    if (date != null) {
      Long initData = DateUtils.getSecondTimestampTwo(date);
      if (initData == 0L) {
        return "";
      }
    } else {
      return "";

    }
    String formatDate = null;
    if (pattern != null) {
      formatDate = DateFormatUtils.format(date, pattern);
    } else {
      formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
    }
    return formatDate;
  }

  /**
   * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
   */
  public static String formatDateTime(Date date) {
    return formatDate(date, "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * 转换为时间（天,时:分:秒.毫秒）
   */
  public static String formatDateTime(long timeMillis) {
    if (timeMillis > 10000000000000L) {
      return DateUtils.formatDate(new Date(timeMillis), "yyyy-MM-dd HH:mm:ss");
    } else {
      return DateUtils.formatDate(new Date(timeMillis * 1000), "yyyy-MM-dd HH:mm:ss");
    }
  }

  /**
   * 转换为时间（天,时:分:秒.毫秒）
   */
  public static String formatDateTime(long timeMillis, String pattern) {
    if (timeMillis > 10000000000000L) {
      return DateUtils.formatDate(new Date(timeMillis), pattern);
    } else {
      return DateUtils.formatDate(new Date(timeMillis * 1000), pattern);
    }
  }

  /**
   * 转换为时间（天）
   */
  public static String formatDate(long timeMillis) {
    if (timeMillis > 10000000000000L) {
      return DateUtils.formatDate(new Date(timeMillis), "yyyy-MM-dd");
    } else {
      return DateUtils.formatDate(new Date(timeMillis * 1000), "yyyy-MM-dd");
    }
  }

  /**
   * 得到当前时间字符串 格式（HH:mm:ss）
   */
	/*public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}*/

  /**
   * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
   */
  public static String getDateTime() {
    return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * 得到当前年份字符串 格式（yyyy）
   */
  public static String getYear() {
    return formatDate(new Date(), "yyyy");
  }

  /**
   * 得到当前月份字符串 格式（MM）
   */
  public static String getMonth() {
    return formatDate(new Date(), "MM");
  }

  /**
   * 得到当天字符串 格式（dd）
   */
  public static String getDay() {
    return formatDate(new Date(), "dd");
  }

  /**
   * 得到当前星期字符串 格式（E）星期几
   */
  public static String getWeek() {
    return formatDate(new Date(), "E");
  }

  /**
   * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
   * "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
   */
  public static Date parseDate(Object str) {
    if (str == null) {
      return null;
    }
    try {
      return parseDate(str.toString(), parsePatterns);
    } catch (ParseException e) {
      return null;
    }
  }

  /**
   * 获取过去的天数
   */
  public static long pastDays(Date date) {

    long t = new Date().getTime() - date.getTime();
    return t / (24 * 60 * 60 * 1000);
  }

  /**
   * 根据年 月 获取对应的月份 天数
   */
  public static int getDaysByYearMonth(int year, int month) {

    Calendar a = Calendar.getInstance();
    a.set(Calendar.YEAR, year);
    a.set(Calendar.MONTH, month - 1);
    a.set(Calendar.DATE, 1);
    a.roll(Calendar.DATE, -1);
    int maxDate = a.get(Calendar.DATE);
    return maxDate;
  }


  public static Date getDateStart(Date date) {
    if (date == null) {
      return null;
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
      date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 00:00:00");
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return date;
  }


  /**
   * 将日期字符串按固定格式转换成日期输出
   */
  public static Date dateFormat(String date, String dateFormat) {
    if (date == null) {
      return null;
    } else {
      SimpleDateFormat format = new SimpleDateFormat(dateFormat);
      if (date != null) {
        try {
          return format.parse(date);
        } catch (Exception var4) {
          ;
        }
      }

      return null;
    }
  }


  /**
   * 获取当前10位时间戳
   */
  public static String dateFormat(Date timestamp) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return format.format(timestamp);
  }

  public static Date getDateEnd(Date date) {
    if (date == null) {
      return null;
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
      date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 23:59:59");
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return date;
  }


  /**
   * 判断字符串是否是日期
   */
  public static boolean isDate(String timeString) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    format.setLenient(false);
    try {
      format.parse(timeString);
    } catch (Exception e) {
      return false;
    }
    return true;
  }

  /**
   * 获取精确到秒的时间戳
   */
  public static Long getSecondTimestampTwo(Date date) {
    if (null == date) {
      return 0l;
    }
    String timestamp = String.valueOf(date.getTime() / 1000);
    return Long.valueOf(timestamp);
  }

  /**
   * 获取系统时间Timestamp
   */
  public static Timestamp getSysTimestamp() {
    return new Timestamp(new Date().getTime());
  }

  /**
   * 获取系统时间Date
   */
  public static Date getSysDate() {
    return new Date();
  }

  /**
   * 生成时间随机数
   */
  public static String getDateRandom() {
    String s = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
    return s;
  }

  /**
   * 获取当月的第一天
   */
  public static long getMonthFirstDay() {
    //获取当前月第一天
    Calendar c = Calendar.getInstance();
    c.add(Calendar.MONTH, 0);
    c.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
    //将小时至0
    c.set(Calendar.HOUR_OF_DAY, 0);
    //将分钟至0
    c.set(Calendar.MINUTE, 0);
    //将秒至0
    c.set(Calendar.SECOND, 0);
    return getSecondTimestampTwo(c.getTime());
  }

  /**
   * 获取当月的最后一天
   */
  public static long getMonthLastDay() {
    //获取当前月最后一天
    Calendar ca = Calendar.getInstance();
    ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
    //将小时至0
    ca.set(Calendar.HOUR_OF_DAY, 23);
    //将分钟至0
    ca.set(Calendar.MINUTE, 59);
    //将秒至0
    ca.set(Calendar.SECOND, 59);
    return getSecondTimestampTwo(ca.getTime());
  }

  /**
   * 获取当前日期是星期几<br>
   *
   * @return 当前日期是星期几
   */
  public static String getWeekOfDate(Date dt) {
    String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    Calendar cal = Calendar.getInstance();
    cal.setTime(dt);

    int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
    if (w < 0) {
      w = 0;
    }

    return weekDays[w];
  }

  public static int getUserAge(Date birthday) {
    if (birthday == null) {
      return 0;
    } else {
      Calendar cal = Calendar.getInstance();
      if (cal.before(birthday)) {
        return 0;
      } else {
        int yearNow = cal.get(1);
        cal.setTime(birthday);
        int yearBirth = cal.get(1);
        return yearNow - yearBirth;
      }
    }
  }

  /**
   * 获取unix时间戳
   */
  public static Date getDateByUnixTime(int unixTime) {
    return new Date((long) unixTime * 1000L);
  }

  /**
   * 格式显示unix时间戳
   */
  public static String formatUnixTime(int unixTime) {
    Date date = new Date((long) unixTime * 1000L);
    return formatDate(date, "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * 格式显示unix时间戳
   */
  public static String formatUnixTime(long unixTime) {
    Date date = new Date(unixTime * 1000L);
    return formatDate(date, "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * 获取Unix时间戳，当前时间
   */
  public static long getUnixTimeLong() {
    return (long) getUnixTimeByDate(new Date());
  }


  /**
   * 获取当前unix时间戳
   */
  public static int getCurrentUnixTime() {
    return getUnixTimeByDate(new Date());
  }

  /**
   * 获取指定日期的Unix的时间戳，返回int类型
   */
  public static int getUnixTimeByDate(Date date) {
    return (int) (date.getTime() / 1000L);
  }


  /**
   * 获取指定日期的Unix的时间戳,返回long类型
   */
  public static long getUnixTimeLong(Date date) {
    return date.getTime() / 1000L;
  }

  /**
   * HH:mm:ss
   */
  public static String getHMS(long timetemp) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(timetemp);
    SimpleDateFormat fmat = new SimpleDateFormat("HH:mm:ss");
    String time = fmat.format(calendar.getTime());
    return time;
  }
}
